package com.dkt.android.base

import com.dkt.android.core.AppManager
import com.dtb.utils.commons.logger.Lerror
import com.dtb.utils.commons.toast.Terror
import com.google.gson.JsonSyntaxException
import io.reactivex.observers.DisposableObserver
import retrofit2.Response
import java.net.ConnectException
import java.net.SocketTimeoutException
import java.net.UnknownHostException


/**
 * @author: dtb
 * @email: wendaoyuqin1@gmail.com
 * @createTime: 19-3-13上午11:59
 */
abstract class BaseCallSubscriber<T> : DisposableObserver<Response<BaseRsps<T>>>() {

    override fun onNext(response: Response<BaseRsps<T>>) {
        val body = response.body()
        if (response.isSuccessful) {
            if (body?.rc.equals("S")) {
                onSuccess(body)
            } else {
                onError(response.code(), body)
            }
        } else {
            handResponseErr(response.code(), body)
        }
        onEnd()
    }

    abstract fun onSuccess(baseRsps: BaseRsps<T>?)

    private fun handResponseErr(code: Int?, baseRsps: BaseRsps<T>?) {
        when (code) {
            401 -> {
                val m = baseRsps?.msg
                if (!m.isNullOrEmpty()) {
                    AppManager.instance.act?.Terror(m[0])
                } else {
                    AppManager.instance.act?.Terror("登陆失效,请重新登陆")
                }
                AppManager.instance.getUserContract()?.loginOut(AppManager.instance.act)
            }
            404 -> onError(code, BaseRsps("无法连接到服务器,请检查网络连接或联系管理员"))
            500 -> onError(code, BaseRsps("系统错误，请检查网络后重试"))
            502 -> onError(code, BaseRsps("系统错误，请检查网络后重试"))
            else -> onError(code, baseRsps)
        }
    }

    /**
     * 所有的错误都会进入 的错误处理点
     * 注意：需要对 401 错误的特殊处理在其他的地方
     * @param code -1 : 网络错误
     *              -2 ：其他的错误
     */
    open fun onError(code: Int?, baseRsps: BaseRsps<T>?) {

    }


    override fun onComplete() {
        dispose()
    }

    open fun onEnd() {
        dispose()
    }

    override fun onError(t: Throwable) {
        //处理常见的几种连接错误
        Lerror { "网络请求错误====\n$t\n${t.message}" }
        when (t) {
            is SocketTimeoutException -> onError(-1, BaseRsps("网络请求超时，请检查网络连接或请稍后重试"))
            is ConnectException -> onError(-1, BaseRsps("服务器连接失败，请稍后重试"))
            is UnknownHostException -> onError(-1, BaseRsps("网络错误，请检查网络连接或请稍后重试"))
//            is UnknownHostException -> onError(-1, BaseRsps("请求地址错误，请联系管理员"))
            is JsonSyntaxException -> onError(-1, BaseRsps("服务器返回异常数据,请联系管理员或稍后重试"))
            else -> onError(-2, BaseRsps("网络错误，请检查网络连接或请稍后重试"))
        }
        onEnd()
    }
}